package com.test.sort;

import java.util.Arrays;

/**
 * @author: 蒿雨
 * @create: 2022-02-14 12:12
 * @description:希尔排序法（交换法）
 */
public class ShellSort {
    public static void main(String[] args) {
        //原始10位数组
        int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
        //希尔排序，交换法
        shellSort(arr);
        //原始10位数组
        int[] arrNew = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
        //希尔排序，移位法
        shellSortMove(arrNew);
    }

    //希尔排序交换法
    private static void shellSort(int[] arr) {
        //循环优化
        //思路：对数组进行两两分组，分别进行排序，而后再进行二次分组
        //原始10位数组
        //int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
        //gap：步长
        int temp = 0;
        for (int gap = arr.length / 2; gap > 0; gap /= 2) {
            //进行循环插入排序
            //第一次分成了五组，分别进行插入排序
            //gap=5;i<10;进行5次循环

            //第二次分成了两组，分别进行插入排序
            //gap=2;i<10;进行8次循环

            //第三次分成了一组，分别进行插入排序
            //gap=1;i<10;进行9次循环

            for (int i = gap; i < arr.length; i++) {
                //第一一轮j=0；第一二轮；j=1，第一三轮，j=2，第一四轮，j=3,第一五轮，j=4;

                //第二一轮j=0;
                //第二二轮j=1;
                //第二三轮j=3,=1;
                //第二四轮j=4,=2,=0;
                //第二五轮j=5,=3,=1;
                //第二六轮j=6,=4,=2,=0;
                //第二七轮j=7,=5,=3,=1;
                //第二八轮j=8,=6,=4,=2,=0;


                //第三一轮j=0;
                //第三二轮j=1,=0；
                //第三三轮j=2,=1,=0;
                //第三四轮j=3,=2,=1,=0,
                //第三五轮j=4,=3,=2,=1,=0;
                //第三六轮j=5,=4,=3,=2,=1,=0;
                //第三七轮j=6,=5,=4,=3,=2,=1,=0;
                //第三八轮j=7,=6,=5,=4,=3,=2,=1,=0
                //第三九轮j=8,=7,=6,=5,=4,=3,=2,=1,=0
                for (int j = i - gap; j >= 0; j -= gap) {
                    //第一一轮
                    if (arr[j] > arr[gap + j]) {
                        temp = arr[j];
                        arr[j] = arr[gap + j];
                        arr[gap + j] = temp;
                    }
                }
            }
        }
        System.out.println("希尔排序交换法："+ Arrays.toString(arr));
    }

    //希尔排序移位法
    private static void shellSortMove(int[] arrNew) {


    }
}
